<?php
error_reporting(0);
set_time_limit(30);
$biggest_memory_limit	=	256; //单位M，后缀不要加M
//临时目录
$tempDir	=	"./data/thumb_temp/";
checkDir($tempDir);

//分析URL
$url = urldecode($_GET['url']);
$url = preg_replace('/(.*)\?(.*)$/','$1',$url);
if(file_exists($url)){
	$url	=	$url;
}elseif($result	=	GrabImage($url,$tempDir)){
	$url	=	$result;
	$grab_temp_file	=	$result;
}else{
	$url	=	"./data/uploads/image/nopic.jpg";
}

//解析参数
$w = $_GET['w']?intval($_GET['w']):'100';	//宽度
$h = $_GET['h']?intval($_GET['h']):'100';	//高度
$t = $_GET['t']=='f'?'f':'c';		//是否切割
$r = $_GET['r']?1:0;			//是否覆盖

//目录名hash
$fileHash	=	md5($url.$w.$h);
$hashPath	=	substr($fileHash,0,2).'/'.substr($fileHash,2,2).'/';

//缩图目录
$thumbDir	=	"./data/thumb/".$hashPath;
checkDir($thumbDir);

if(!$sourceInfo['type']) 
    $sourceInfo['type'] == 'jpg';

$tempFile	=	$tempDir.$fileHash.'.'.$sourceInfo['type'];
$thumbFile	=	$thumbDir.$fileHash."_".$w."_".$h."_".$t.'.'.$sourceInfo['type'];

$img		=	new Image();
//判断是否替换，存在则跳转，不存在继续进行
if(!$r && file_exists($thumbFile)){
	//这里有2种方法，第一种多一次跳转，多一个http连接数，第二种，要进行一次php处理，多占用一部分内存。
	$img->showImg($thumbFile);
}

//不存在输出
if(copy($url,$tempFile)){
	//判断图片大小 如果图片宽和高都小于要缩放的比例 直接输出
	$info	=	getimagesize($tempFile);
	//判断处理图片大约需要的内存
	$need_memory	=	(($info[0]*$info[1])/100000);
	$memory_limit	=	ini_get('memory_limit');
	if( ($need_memory > $memory_limit) && ($need_memory <= $biggest_memory_limit) ){
		ini_set('memory_limit',$need_memory.'M');
	}

	if($info[0]<=$w && $info[1]<=$h){
		copy($tempFile,$thumbFile);
		$img->showImg($thumbFile,'',$info[0],$info[1]);
		unlink($tempFile);
		unlink($grab_temp_file);
		exit;
	}else{
		//生成缩图
		if($t=='c'){
			$thumb	=	$img->cutThumb($tempFile,$thumbFile,$w,$h);
		}elseif($t=='f'){
			$thumb	=	$img->thumb($tempFile,'',$thumbFile,$w,$h);
		}
		//输出缩图
		$img->showImg($thumb,'',$w,$h);
		unlink($tempFile);
		unlink($grab_temp_file);
		exit;
	}
}

//获取远程图片
function GrabImage($url,$thumbDir) {
	if($url=="")	return false;
	$filename	=	md5($url).strrchr($url,".");
	$img		=	file_get_contents($url);
	if(!$img)		return false;

	$filepath	=	$thumbDir.$filename;
	$result		=	file_put_contents($filepath,$img);
	if($result){
		return $filepath;
	}else{
		return false;
	}
}

//检查并创建多级目录
function checkDir($path){
	$pathArray = explode('/',$path);
	$nowPath = '';
	array_pop($pathArray);
	foreach ($pathArray as $key=>$value){
		if ( ''==$value ){
			unset($pathArray[$key]);
		}else{
			if ( $key == 0 )
				$nowPath .= $value;
			else
				$nowPath .= '/'.$value;
			if ( !is_dir($nowPath) ){
				if ( !mkdir($nowPath, 0777) ) return false;
			}
		}
	}
	return true;
}
class Image {

    function __construct() {}

    /**
     * 取得图像信息
     * @static
     * @access public
     * @param string $image 图像文件名
     * @return mixed
     */
    function getImageInfo($img) {
        $imageInfo = getimagesize($img);
        if( $imageInfo!== false) {
			if(function_exists(image_type_to_extension)){
				$imageType = strtolower(substr(image_type_to_extension($imageInfo[2]),1));
			}else{
				$imageType = strtolower(substr($img,strrpos($img,'.')+1));
			}
            $imageSize = filesize($img);
            $info = array(
                "width"=>$imageInfo[0],
                "height"=>$imageInfo[1],
                "type"=>$imageType,
                "size"=>$imageSize,
                "mime"=>$imageInfo['mime']
            );
            return $info;
        }else {
            return false;
        }
    }

    /**
     * 显示服务器图像文件
     * 支持URL方式
     * @static
     * @access public
     * @param string $imgFile 图像文件名
     * @param string $text 文字字符串
     * @param string $width 图像宽度
     * @param string $height 图像高度
     * @return void
     */
    function showImg($imgFile,$text='',$width=80,$height=30) {
        //获取图像文件信息
		$info = Image::getImageInfo($imgFile);
        if($info !== false) {
            $createFun  =   str_replace('/','createfrom',$info['mime']);
            $im = $createFun($imgFile);
            if($im) {
                $ImageFun= str_replace('/','',$info['mime']);
				//水印开始
                if(!empty($text)) {
                    $tc  = imagecolorallocate($im, 0, 0, 0);
					if(is_file($text)&&file_exists($text)){
						// 取得水印信息
						$textInfo = Image::getImageInfo($text);
						$createFun2= str_replace('/','createfrom',$textInfo['mime']);
						$waterMark = $createFun2($text);
						$imgW	=	$info["width"];
						$imgH	=	$info["width"]*$textInfo["height"]/$textInfo["width"];
						$y	=	($info["height"]-$textInfo["height"])/2;
						if(function_exists("ImageCopyResampled"))
							ImageCopyResampled($im,$waterMark,0,$y,0,0, $imgW,$imgH, $textInfo["width"],$textInfo["height"]);
						else
							ImageCopyResized($im,$waterMark,0,$y,0,0,$imgW,$imgH,  $textInfo["width"],$textInfo["height"]);
					}else{
						imagestring($im, 3, 5, 5, $text, $tc);
					}
                }
				//水印结束
                if($info['type']=='png' || $info['type']=='gif') {
                imagealphablending($im, FALSE);//取消默认的混色模式
                imagesavealpha($im,TRUE);//设定保存完整的 alpha 通道信息
                }
                Header("Content-type: ".$info['mime']);
                $ImageFun($im);
                @ImageDestroy($im);
                return ;
            }
        }
        //获取或者创建图像文件失败则生成空白PNG图片
        $im  = imagecreatetruecolor($width, $height);
        $bgc = imagecolorallocate($im, 255, 255, 255);
        $tc  = imagecolorallocate($im, 0, 0, 0);
        imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
        imagestring($im, 4, 5, 5, "no pic", $tc);
        Image::output($im);
        return ;
    }

	// 切割缩图cutThumb
	function cutThumb($image,$filename='',$maxWidth='200',$maxHeight='50',$warterMark='',$type='',$interlace=true,$suffix='_thumb'){
        // 获取原图信息
        $info  = Image::getImageInfo($image);
         if($info !== false) {
            $srcWidth  = $info['width'];
            $srcHeight = $info['height'];
            $pathinfo = pathinfo($image);
			$type =  $pathinfo['extension'];
            $type = empty($type)?$info['type']:$type;
			$type	=	strtolower($type);
            $interlace  =  $interlace? 1:0;
            unset($info);
            // 载入原图
            $createFun = 'ImageCreateFrom'.($type=='jpg'?'jpeg':$type);
            $srcImg     = $createFun($image);

            //创建缩略图
            if($type!='gif' && function_exists('imagecreatetruecolor'))
                $thumbImg = imagecreatetruecolor($maxWidth, $maxHeight);
            else
                $thumbImg = imagecreate($maxWidth, $maxHeight);

            // 新建PNG缩略图通道透明处理
            if('png'==$type) {
                imagealphablending($thumbImg, false);//取消默认的混色模式
                imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
            }elseif('gif'==$type) {
            // 新建GIF缩略图预处理，保证透明效果不失效
	            $background_color  =  imagecolorallocate($thumbImg,  0,255,0);  //  指派一个绿色
	            imagecolortransparent($thumbImg,$background_color);  //  设置为透明色，若注释掉该行则输出绿色的图
            }

			// 计算缩放比例
			if(($maxWidth/$maxHeight)>=($srcWidth/$srcHeight)){
				//宽不变,截高，从中间截取 y=
				$width	=	$srcWidth;
				$height	=	$srcWidth*($maxHeight/$maxWidth);
				$x		=	0;
				$y		=	($srcHeight-$height)*0.5;
			}else{
				//高不变,截宽，从中间截取，x=
				$width	=	$srcHeight*($maxWidth/$maxHeight);
				$height	=	$srcHeight;
				$x		=	($srcWidth-$width)*0.5;
				$y		=	0;
			}
			// 复制图片
			if(function_exists("ImageCopyResampled")){
				ImageCopyResampled($thumbImg, $srcImg, 0, 0, $x, $y, $maxWidth, $maxHeight, $width,$height);
			}else{
				ImageCopyResized($thumbImg, $srcImg, 0, 0, $x, $y, $maxWidth, $maxHeight,  $width,$height);
			}
			ImageDestroy($srcImg);
            // 对jpeg图形设置隔行扫描
            if('jpg'==$type || 'jpeg'==$type) 	imageinterlace($thumbImg,$interlace);

            // 生成图片
            $imageFun	=	'imagepng';
			$filename  = empty($filename)? substr($image,0,strrpos($image, '.')).$suffix.'.'.$type : $filename;
            $imageFun($thumbImg,$filename);
            ImageDestroy($thumbImg);
            return $filename;
         }
         return false;

	}
    /**
     * 生成缩略图
     * @static
     * @access public
     * @param string $image  原图
     * @param string $type 图像格式
     * @param string $filename 缩略图文件名
     * @param string $maxWidth  宽度
     * @param string $maxHeight  高度
     * @param string $position 缩略图保存目录
     * @param boolean $interlace 启用隔行扫描
     * @return void
     * @throws ThinkExecption
     */
    function thumb($image,$type='',$filename='',$maxWidth=200,$maxHeight=50,$warterMark='',$interlace=true,$suffix='_thumb'){
        // 获取原图信息
        $info = Image::getImageInfo($image);
        if ($info !== false) {
            $srcWidth = $info['width'];
            $srcHeight = $info['height'];
            $type = empty($type) ? $info['type'] : $type;
            $type = strtolower($type);
            $interlace = $interlace ? 1 : 0;
            unset($info);
            $scale = min($maxWidth / $srcWidth, $maxHeight / $srcHeight); // 计算缩放比例
            if ($scale >= 1) {
                // 超过原图大小不再缩略
                $width = $srcWidth;
                $height = $srcHeight;
            } else {
                // 缩略图尺寸
                $width = (int) ($srcWidth * $scale);
                $height = (int) ($srcHeight * $scale);
            }

            // 载入原图
            $createFun = 'ImageCreateFrom' . ($type == 'jpg' ? 'jpeg' : $type);
            $srcImg = $createFun($image);

            //创建缩略图
            if ($type != 'gif' && function_exists('imagecreatetruecolor'))
                $thumbImg = imagecreatetruecolor($width, $height);
            else
                $thumbImg = imagecreate($width, $height);

            // 复制图片
            if (function_exists("ImageCopyResampled"))
                imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
            else
                imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth, $srcHeight);
            if ('gif' == $type || 'png' == $type) {
                //imagealphablending($thumbImg, false);//取消默认的混色模式
                //imagesavealpha($thumbImg,true);//设定保存完整的 alpha 通道信息
                $background_color = imagecolorallocate($thumbImg, 0, 255, 0);  //  指派一个绿色
                imagecolortransparent($thumbImg, $background_color);  //  设置为透明色，若注释掉该行则输出绿色的图
            }

            // 对jpeg图形设置隔行扫描
            if ('jpg' == $type || 'jpeg' == $type)
                imageinterlace($thumbImg, $interlace);

            // 生成图片
            $imageFun = 'image' . ($type == 'jpg' ? 'jpeg' : $type);
            $imageFun($thumbImg, $thumbname);
            imagedestroy($thumbImg);
            imagedestroy($srcImg);
            return $thumbname;
        }
        return false;
    }

    function output($im,$type='png'){
        Header("Content-type: image/".$type);
        $ImageFun='ImagePNG';
		$ImageFun($im);
        ImageDestroy($im);
    }
}
?>